#!/usr/bin/env node

const fs= require('fs');

const width= 16,
      height= 16;

let pixelByteSize = width * height * 4;
let totalSize = pixelByteSize + 54;

let buf = Buffer.alloc(totalSize);

buf.fill(0);

buf.write('BM');
buf.writeUInt32LE(totalSize,0x02);
buf.writeUInt32LE(54,0x0a);
buf.writeUInt32LE(40,0x0e);
buf.writeUInt16LE(1,0x1a);
buf.writeUInt16LE(32,0x1c);
buf.writeUInt32LE(pixelByteSize,0x22);
buf.writeInt32LE(width,0x12);
buf.writeInt32LE(height,0x16);

for(let i=54; i<totalSize;i+=4){
    buf.writeUInt32LE(0xff0000ff,i);
}

/**
 * #!/usr/bin/env node

这是一个shebang行，用于指定脚本应该通过哪个解释器执行。在这里，它告诉系统使用环境中的 node 命令来执行这个脚本。
const fs = require('fs');

导入Node.js的 fs（文件系统）模块，用于文件操作。
const width = 16, height = 16;

设置图像的宽度和高度都为16像素。
let pixelByteSize = width * height * 4;

计算每个像素的字节大小。因为BMP图像通常使用32位颜色（即4字节），所以每个像素占用4字节。
let totalSize = pixelByteSize + 54;

计算整个BMP文件的总大小。BMP文件的头部有54字节是固定的，加上像素数据的大小。
let buf = Buffer.alloc(totalSize);

使用 Buffer.alloc 方法分配一个新的 Buffer 对象，大小为 totalSize。
buf.fill(0);

使用 fill 方法将 Buffer 对象中的所有字节初始化为0。
buf.write('BM');

在 Buffer 对象的开始处写入字符串 'BM'，这是BMP文件的文件头标识。
buf.writeUInt32LE(totalSize, 0x02);

在偏移量 0x02 处写入整个文件的大小。
buf.writeUInt32LE(54, 0x0a);

在偏移量 0x0a 处写入像素数据的偏移量（头部大小）。
buf.writeUInt32LE(40, 0x0e);

在偏移量 0x0e 处写入信息头的大小（40字节）。
buf.writeUInt16LE(1, 0x1a);

在偏移量 0x1a 处写入图像的宽度（16像素）。
buf.writeUInt16LE(32, 0x1c);

在偏移量 0x1c 处写入图像的高度（32像素，注意这里应该是一个错误，因为之前设置的高度是16）。
buf.writeUInt32LE(pixelByteSize, 0x22);

在偏移量 0x22 处写入像素数据的大小。
buf.writeInt32LE(width, 0x12);

在偏移量 0x12 处写入图像的宽度（16像素）。
buf.writeInt32LE(height, 0x16);

在偏移量 0x16 处写入图像的高度（16像素）。
for (let i = 54; i < totalSize; i += 4) { ... }

循环遍历 Buffer 对象，从偏移量54开始（像素数据的开始），直到 Buffer 对象的末尾。
在每个像素位置写入一个32位的颜色值（0xff0000ff），这是一个ARGB值，表示完全不透明的蓝色。
 */
